(レポート) BDT205: AWSによる初めてのビックデータアプリケーション #reinvent
業務でAWSを活用したデータ分析基盤の構築やコンサルしておりますが、本セッションはAWSを利用してデータ分析をご検討の方が、どのサービスをどのように組み合わせたら良いかについて、最新のトピックを具体的かつ簡潔に解説しています。
BDT205: Your First Big Data Application on AWS
概要
セッションの解説より
Amazonのビッグデータ・ウェブ・サービスを利用して、AWSの上で最初のビッグデータアプリケーションを起動する方法をより知りたいですか? Amazon EMR 、Amazon Redshift、Amazon kinesis、Amazon DynamoDB、Amazon S3を使用してリアルタイムでのビッグデータアプリケーションを構築する旅にご参加ください。 AWS上のビッグデータ・ソリューションのアーキテクチャ設計パターンを確認し、再構築し、アプリケーションを自分でカスタマイズすることができるように私たちのラボへのあなたご招待します!
はじめに
データ分析の流れ
データ分析は、集める(Collect)、処理する(Process)、分析する(Analyze)の3つ手順を踏みます。
- 集める(Collect)は、データソースとしてデータ収集のサービスやデータストアです。
- 処理する(Process)は、集められたデータを定期的もしくは溜まったタイミングでデータを取り出し(Event Processing)と、コード変換、フォーマット変換、データクレンジング、一次集計といったデータの処理(Data Processing)です。いわゆるETLを意味します。
- 分析する(Analyze)は、構造化されたETL済みのデータからELT、マートの作成を作成し、分析データとして利用できるデータとなります。
- 機械学習は構造化されたETL済みのデータをデータソースします。また、機械学習の結果を分析データにフィードバックします。
初めてのビックデータアプリケーション〜データフロー
Kinesisに集められたログストリームを定期的にAmazon S3にデータを保存します。そのデータをAmazon EMRでETLして、構造化したETL済み中間データをAmazon S3に保存します。Amazon Redshiftに構造化データをロードし、マート作成して、BIツールなどで視覚化します。
AWS CLI によるセットアップ
Amazon Kinesis
ログデータの入力に1つのシャードを作ります。
Amazon S3
S3バケットの作成です。
Amazon EMR
2ノードのEMRクラスタを作成します。(下記では、emr-4.0.0ですが、最新は4.1.0です)
Amazon Redshift
シングルノードクラスタを作成します。
初めてのビックデータアプリケーション〜コンポーネントと役割
- 集める(Collect):Log4Jを使ってストリームデータをKinesisに保存
- 処理する(Process):EMRのSparkとHiveを使ってデータを処理
- 分析する(Analyze):分析データをRdedsiftに入れてSQLで使う
集める(Collect)
Amazon Kinesis Log4J AppenderによるログのPut
Amazon Kinesis Log4J Appender をウェブアプリケーションに組み込んで、アプリケーションから直接KinesisにログストリームをPutできます。
Amazon Kinesis Log4j Appender JAR をダウンロードします。
kinesis-log4j-appender-1.0.0.jar をダウンロードしたフォルダに、AwsCredentials.properties というファイルを作成し、ご自分の認証情報を指定して編集します: accessKey=<your_access_key> secretKey=<your_secret_key> <your_access_key> と <your_secret_key> をご自分の AWS アカウントの accessKey と secretKey に置き換えてください。アクセスキーの詳細については、「How Do I Get Security Credentials?」を参照してください。
サンプルアクセスログファイル access_log_1 をダウンロードして、認証情報と JAR ファイルを保存したディレクトリと同じディレクトリに保存します。
Linux、UNIX、Mac OS X ユーザー:
${JAVA_HOME}/bin/java -cp .:kinesis-log4j-appender-1.0.0.jar \ com.amazonaws.services.kinesis.log4j.FilePublisher access_log_1
Windows ユーザー:
%JAVA_HOME%/bin/java -cp .;kinesis-log4j-appender-1.0.0.jar \ com.amazonaws.services.kinesis.log4j.FilePublisher access_log_1
Spark
- 大規模データ処理の向けの、高速かつ多目的エンジン
- Java、Scala、Pythonによって素早くアプリケーショが書ける
- (方言ありですが)SQL互換、ストリーミング処理、複雑な分析
Amazon Kinesis と Spark Streaming
KinesisはSpark Stremingによって直接EMRにデータを受け渡すことができる。また、KCL(Kinesis Client Liblary)を使ってDynamoDBにデータを投入することも可能です。
Amazon EMR の Spark Streaming の使い方
EMRクラスタにログイン:
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=30 \ -i YOUR-AWS-SSH-KEY hadoop@YOUR-EMR-HOSTNAME
EMRクラスタ上でKCLをダウンロード:
wget http://repo1.maven.org/maven2/com/amazonaws/amazon-kinesis-client/1.6.0/amazon-kinesis-client-1.6.0.jar
※ 最新は amazon-kinesis-client-1.6.1 です。
コンソールノイズの除去:
sudo sed -i 's/INFO/ERROR/g' /usr/lib/spark/conf/spark-default.conf sudo sed -i 's/INFO/ERROR/g' /usr/lib/spark/conf/log4j.properties
Spark shell の起動:
spark-shell \ --jars /usr/lib/spark/extras/lib/spark-streamingkinesis-asl.jar,amazon-kinesis-client-1.6.0.jar \ --driver-javaoptions "-Dlog4j.configuration=file:///etc/spark/conf/log4j.properties"
インポートライブラリ
spark-shellの再設定
Spark Streaming による Kinesisからの読み込み
KinesisClientのインスタンスの生成
KinesisClientの開始
S3の確認
aws s3 la s3://YOUR-S3-BUCKET/access-log-raw/ --recursive
処理する(Process)
Spark SQL
SQLによる構造化データ操作のためのSparkのモジュール構成
変更を加えることなく、既存のデータのHiveクエリを走らせることができます。
EMRでSparkSQLを使う方法
EMRクラスタにログイン:
ssh -i YOUR-AWS-SSH-KEY hadoop@YOUR-EMR-HOSTNAME
※資料は、"ssh -i YOUR-AWS-SSH-KEY YOUR-EMR-HOSTNAME" と記載されていた。
Spark shell の起動:
spark-sql \ --driver-javaoptions "-Dlog4j.configuration=file:///etc/spark/conf/log4j.properties"
S3バケットにテーブルを作成する際のポイント
Spark SQL でクエリーを実行
Amazon Redshiftにインポートする前にやるべきこと
- Hiveのユーザー定義関数(UDF)を使って、from_unixtime、unix_timestamp、hourは変換する。
- 「時」の値が重要です。これは分割とAmazon S3に書き込む前に、出力ファイルを整理するために使用されるものです。これらの分割は、並列「COPY」コマンドを使用して、私たちはより効率的に、後のLabではAmazon Redshiftにデータをロードすることができます。
- 「時」の値が重要です。これはAmazon S3に書き込む際にdのように分割したり、まとめるのに役立つからです。このようにファイルを分割することで、並列COPYを利用して、Amazon Redshiftへ効率的にデータをロードすることができます。
S3の外部テーブルの作成
分割と圧縮を設定
S3への書き込み
S3の出力ファイルの確認
分析する(Analyze)
Redshiftにテーブルを作成〜データのロード
分析結果の視覚化
- (上記の)クライアントサイドJavaScriptの例はD3によって作られたライブラリPlottableを使っています。
- ほんの僅かな期間Amazon S3上でホストされています。
- Lambda 関数は、Redshiftをクエリーするために使用します。
※ 視覚化の手段として、Tableau 等の選択肢もあります。今後は QuickSight 有力な選択肢となるでしょう。
AWS Cloud をお試しください...
(一時間あたりの)コストは、約コーヒー一杯分です。
まとめ
当初は200番台の初級者向けの、昨年のセッションの焼き直しかと思っていましたが、実際には最新のKinesisによるデータ収集、最新EMR(Spark)によるSparkStreamingとETLについて、ステップ・バイ・ステップで解説された貴重なセッションでした。思わず手を動かさずにはいられなくなったのではないかと思います。